/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.sorbonne.inf5.yams.vue;

import fr.sorbonne.inf5.yams.properties.BundleTool;
import fr.sorbonne.inf5.yams.controleur.ControleurApplication;
import fr.sorbonne.inf5.yams.controleur.ControleurJeu;
import java.awt.BorderLayout;
import java.awt.Color;
import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * Classe qui se charge de l'affichage
 * de l'application
 * @author Dubos Romain
 * @author Oukherfellah Riad
 */
public class VueApplication extends JFrame {

    //OBJETS DU MENU
    private JMenu menu, partie, langue;
    private JMenuItem quitter, partieUnjoueur, partieDeuxjoueurs,
            partieOrdi, afficher_score, francais, anglais;
    //AUTRE
    private JLabel scoreIA, affichageScoreIA;
    //NOM ACTION COMMANDES
    public static final String MENU = "menu";
    public static final String QUITTER = "quitter";
    public static final String AFFICHER_SCORE = "afficher_score";
    public static final String PARTIE = "partie";
    public static final String PARTIE_UN_JOUEUR = "partie1j";
    public static final String PARTIE_DEUX_JOUEURS = "partie2j";
    public static final String PARTIE_CONTRE_ORDI = "partieOrdi";
    public static final String LANGUE = "langue";
    public static final String FRANCAIS = "francais";
    public static final String ANGLAIS = "anglais";
    //MESSAGES ET TITRES
    public static String T1; //titre de la boite de dialogue
    public static String M1; //Message dans la boite de dialogue
    public static String T2;
    public static String M2;
    public static String T3;
    public static String M3;
    public static String T4;
    public static String M4;
    public static String T5;
    public static String T6;
    public static String M6;
    public static String T7;
    public static String M7;
    public static String T8;
    public static String M8;
    //BOUTON
    private JButton bouton_lancer;
    //ACTION COMMANDE DU BOUTON
    public static final String LANCER = "lancer";
    //BOITES DE DIALOGUE
    DialogDeuxJoueurs dialog2j; //pour partie à deux
    DialogUnJoueur dialog1jSolo; //pour partie solo
    DialogUnJoueur dialog1jOrdi; //Pour partie contre l'ordinateur
    //VueDès
    private VueDes des; //Vue se chargant de l'affichage des dés
    private VueCombinaisons combinaisons; //Vue se chargant de l'affichage des combinaisons

    /**
     * Constructeur de la vue
     */
    public VueApplication() {


        this.setSize(600, 600);
        this.setLayout(new BorderLayout());

        this.initiliseBarMenu();

        //Affichage des dès
        this.des = new VueDes();
        this.combinaisons = new VueCombinaisons();


        this.add(this.initialisePanelCombinaison(), BorderLayout.CENTER);
        this.add(this.initialisePanelDes(), BorderLayout.NORTH);

        //On grise la vue
        this.griserVue();

        //FENETRES DE DIALOGUE
        this.dialog2j = new DialogDeuxJoueurs(this, BundleTool.getBundle().getString("partieAdeux"), true);
        this.dialog1jOrdi = new DialogUnJoueur(this, BundleTool.getBundle().getString("partieOrdi"), true);
        this.dialog1jOrdi.setActionCommandeOrdi();
        this.dialog1jSolo = new DialogUnJoueur(this, BundleTool.getBundle().getString("partieSolo"), true);
        this.dialog1jSolo.setActionCommandeSolo();

        this.nommerComposants();
        this.bloqueItemLangueCourante();

        this.setVisible(true);
    }

    /**
     * Initalisation de la barre de menu et
     * de ses coposants
     */
    private void initiliseBarMenu() {
        this.quitter = new JMenuItem();
        this.quitter.setActionCommand(QUITTER);
        this.afficher_score = new JMenuItem();
        this.afficher_score.setActionCommand(AFFICHER_SCORE);
        this.langue = new JMenu();
        this.langue.setActionCommand(LANGUE);
        this.francais = new JMenuItem();
        this.francais.setActionCommand(FRANCAIS);
        this.anglais = new JMenuItem();
        this.anglais.setActionCommand(ANGLAIS);


        this.langue.add(this.francais);
        this.langue.add(this.anglais);

        this.menu = new JMenu();

        this.menu.add(this.langue);
        this.menu.add(afficher_score);
        this.menu.add(quitter);

        this.partieUnjoueur = new JMenuItem();
        this.partieUnjoueur.setActionCommand(PARTIE_UN_JOUEUR);
        this.partieDeuxjoueurs = new JMenuItem();
        this.partieDeuxjoueurs.setActionCommand(PARTIE_DEUX_JOUEURS);
        this.partieOrdi = new JMenuItem();
        this.partieOrdi.setActionCommand(PARTIE_CONTRE_ORDI);

        this.partie = new JMenu();
        this.partie.add(partieUnjoueur);
        this.partie.add(partieOrdi);
        this.partie.add(partieDeuxjoueurs);

        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);
        menuBar.add(partie);
        this.setJMenuBar(menuBar);

        this.scoreIA = new JLabel();
        this.scoreIA.setVisible(false);
        this.affichageScoreIA = new JLabel();
        this.affichageScoreIA.setVisible(false);
    }

    /**
     * Initialise le panel contenant
     * l'ensemble des combinaisions
     */
    private JPanel initialisePanelCombinaison() {

        return this.combinaisons.getPanel();
    }

    /**
     * Initialise le panel contenant
     * les dès et un bouton (lancer les dès)
     */
    private JPanel initialisePanelDes() {

        JPanel panelLancer = new JPanel();

        this.bouton_lancer = new JButton();
        this.bouton_lancer.setActionCommand(LANCER);
        panelLancer.add(this.bouton_lancer);
        panelLancer.add(this.scoreIA);
        panelLancer.add(this.affichageScoreIA);
        panelLancer.setBackground(Color.WHITE);

        JPanel panelDe = new JPanel(new BorderLayout());
        panelDe.add(this.des.getPanel(), BorderLayout.CENTER);
        panelDe.add(panelLancer, BorderLayout.SOUTH);


        return panelDe;
    }

    /**
     * Permet de nommer l'ensemble des coposants
     * et titre de l'application
     */
    public final void nommerComposants() {

        setTitle(BundleTool.getBundle().getString("titre"));
        this.quitter.setText(BundleTool.getBundle().getString("quitter"));
        this.menu.setText(BundleTool.getBundle().getString("menu"));
        this.afficher_score.setText(BundleTool.getBundle().getString("AfficheScore"));
        this.langue.setText(BundleTool.getBundle().getString("langue"));
        this.francais.setText(BundleTool.getBundle().getString("fr_FR"));
        this.anglais.setText(BundleTool.getBundle().getString("en_GB"));
        this.partie.setText(BundleTool.getBundle().getString("partie"));

        this.partieUnjoueur.setText(BundleTool.getBundle().getString("partieSolo"));
        this.partieDeuxjoueurs.setText(BundleTool.getBundle().getString("partieAdeux"));
        this.partieOrdi.setText(BundleTool.getBundle().getString("partieOrdi"));
        this.bouton_lancer.setText(BundleTool.getBundle().getString("lancer"));

        this.affichageScoreIA.setText("0");
        this.scoreIA.setText(BundleTool.getBundle().getString("scoreIA"));

        //MESSAGES ET TITRES
        T1 = BundleTool.getBundle().getString("T1");
        M1 = BundleTool.getBundle().getString("M1");
        T2 = BundleTool.getBundle().getString("T2");
        M2 = BundleTool.getBundle().getString("M2");
        T3 = BundleTool.getBundle().getString("T3");
        M3 = BundleTool.getBundle().getString("M3");
        T4 = BundleTool.getBundle().getString("T4");
        M4 = BundleTool.getBundle().getString("M4");
        T5 = BundleTool.getBundle().getString("T5");
        T6 = BundleTool.getBundle().getString("T6");
        M6 = BundleTool.getBundle().getString("M6");
        T7 = BundleTool.getBundle().getString("T7");
        M7 = BundleTool.getBundle().getString("M7");
        T8 = BundleTool.getBundle().getString("T8");
        M8 = BundleTool.getBundle().getString("M8");

        //BOITES DE DIALOGUES
        this.dialog1jSolo.nommerComposants();
        this.dialog1jSolo.setTitle(BundleTool.getBundle().getString("partieSolo"));
        this.dialog1jOrdi.nommerComposants();
        this.dialog1jOrdi.setTitle(BundleTool.getBundle().getString("partieOrdi"));
        this.dialog2j.nommerComposants();
        this.dialog2j.setTitle(BundleTool.getBundle().getString("partieAdeux"));
    }

    /**
     * Abonne les éléments de la vue avec leur
     * listener
     * @param ctrl controleur de l'application
     */
    public void abonnementPrincipale(ControleurApplication ctrl) {
        //ABONNEMENT DES BOUTONS DES BOITES DE DIALOGUE
        this.dialog2j.abonnement(ctrl);
        this.dialog1jSolo.abonnement(ctrl);
        this.dialog1jOrdi.abonnement(ctrl);

        //ABONNEMENT MENU_ITEM
        this.partieDeuxjoueurs.addActionListener(ctrl);
        this.partieUnjoueur.addActionListener(ctrl);
        this.partieOrdi.addActionListener(ctrl);
        this.francais.addActionListener(ctrl);
        this.anglais.addActionListener(ctrl);
        this.quitter.addActionListener(ctrl);
        this.afficher_score.addActionListener(ctrl);

        //Quitter (fenetre)
        this.addWindowListener(ctrl);
    }

    /**
     * Abonne les éléments de la vue nécessaires au jeu 
     * @param ctrl controleur de l'application
     */
    public void abonnementJeu(ControleurJeu ctrl) {
        this.bouton_lancer.addActionListener(ctrl);

        //Abonnement des dés
        this.des.abonnement(ctrl);
        //Abonnement des combinaisons
        this.combinaisons.abonnement(ctrl);
    }

    /**
     * grise les boutons de la vue
     */
    public final void griserVue() {
        this.combinaisons.griserVue();
        this.des.griserVue();
        this.bouton_lancer.setEnabled(false);
    }

    /**
     * degrise les boutons de la vue
     */
    public void deGriserVue() {
        this.combinaisons.deGriserVue();
        this.des.deGriserVue();
        this.bouton_lancer.setEnabled(true);
    }

    /**
     * Affiche une fenetre de dialogue avec
     * un message d'information destiné à l'utilisateur
     * @param titre titre de la fenetre de dialogue
     * @param message message à afficher
     */
    public void afficherMessageInfo(String titre, String message) {
        JOptionPane.showMessageDialog(this, message,
                titre,
                JOptionPane.INFORMATION_MESSAGE);
    }

    /**
     * Affiche une fenetre de dialogue avec
     * un message d'erreur destiné à l'utilisateur
     * @param titre titre de la fenetre de dialogue
     * @param message message à afficher
     */
    public void afficherMessageErreur(String titre, String message) {
        JOptionPane.showMessageDialog(this, message,
                titre,
                JOptionPane.WARNING_MESSAGE);
    }

    /**
     * Renvoie la boite de dialogue permettant
     * d'entrer le nom des 2 joueurs
     * @return boite de dialogue
     */
    public DialogDeuxJoueurs getFenetreNom2Joueurs() {
        return this.dialog2j;
    }

    /**
     * Renvoie la boite de dialogue permettant
     * d'entrer le nom d'un joueur (partie solo)
     * @return boite de dialogue
     */
    public DialogUnJoueur getFenetreNom1JoueurSolo() {
        return this.dialog1jSolo;
    }

    /**
     * Renvoie la boite de dialogue permettant
     * d'entrer le nom d'un joueur (contre l'ordinateur)
     * @return boite de dialogue
     */
    public DialogUnJoueur getFenetreNom1JoueurOrdi() {
        return this.dialog1jOrdi;
    }

    /**
     * Grise l'item de selection de la langue
     * déjà en place
     */
    public final void bloqueItemLangueCourante() {
        Locale localeCourante = BundleTool.getBundle().getLocale();
        if (localeCourante.equals(Locale.FRANCE)) {
            this.francais.setEnabled(false);
        } else {
            this.francais.setEnabled(true);
        }
        if (localeCourante.equals(Locale.UK)) {
            this.anglais.setEnabled(false);
        } else {
            this.anglais.setEnabled(true);
        }
    }

    /**
     * Renvoie la vue gérant l'affichage des dés
     * @return VueDes
     */
    public VueDes renvoyerVueDes() {
        return this.des;
    }

    /**
     * Renvoie la vue gérant l'affichage des combinaison
     * @return VueDes
     */
    public VueCombinaisons renvoyerVueCombinaisons() {
        return this.combinaisons;
    }

    /**
     * Afficher le score de l'ordinateur
     * @param pScoreIA
     */
    public void afficherScoreIA(String pScoreIA) {
        this.affichageScoreIA.setText(pScoreIA);
        this.affichageScoreIA.setVisible(true);
        this.scoreIA.setVisible(true);
    }

    /**
     * Masque le score de l'IA
     */
    public void masquerScoreIA() {
        this.affichageScoreIA.setVisible(false);
        this.scoreIA.setVisible(false);
    }
}
